From 63973ab30ade5e0aab168766837bb2afdb14a33e Mon Sep 17 00:00:00 2001 From: Jonathan Blandford Date: Sat, 6 Oct 2001 00:50:36 +0000 Subject: [PATCH] improve warning. Fri Oct 5 20:50:00 2001 Jonathan Blandford * gtk/gtktreestore.c (gtk_tree_store_iter_has_child): improve warning. * gtk/gtktreemodel.c (gtk_tree_row_reference_new_proxy): ref and unref nodes, #okay61676 * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_sort): we listen to the property; no need to clear the other columns. Also, we go to 'unsorted' if the model supports it. --- ChangeLog | 12 ++++++ ChangeLog.pre-2-0 | 12 ++++++ ChangeLog.pre-2-10 | 12 ++++++ ChangeLog.pre-2-2 | 12 ++++++ ChangeLog.pre-2-4 | 12 ++++++ ChangeLog.pre-2-6 | 12 ++++++ ChangeLog.pre-2-8 | 12 ++++++ gtk/gtktreemodel.c | 82 ++++++++++++++++++++++++++++++++++++++--- gtk/gtktreestore.c | 2 +- gtk/gtktreeviewcolumn.c | 55 ++++++++++++++------------- 10 files changed, 192 insertions(+), 31 deletions(-) diff --git a/ChangeLog b/ChangeLog index 604368417d..88082d59f9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +Fri Oct 5 20:50:00 2001 Jonathan Blandford + + * gtk/gtktreestore.c (gtk_tree_store_iter_has_child): improve + warning. + + * gtk/gtktreemodel.c (gtk_tree_row_reference_new_proxy): ref and + unref nodes, #okay61676 + + * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_sort): we listen + to the property; no need to clear the other columns. Also, we go + to 'unsorted' if the model supports it. + 2001-10-05 Sven Neumann * demos/testpixbuf-save.c diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 604368417d..88082d59f9 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,15 @@ +Fri Oct 5 20:50:00 2001 Jonathan Blandford + + * gtk/gtktreestore.c (gtk_tree_store_iter_has_child): improve + warning. + + * gtk/gtktreemodel.c (gtk_tree_row_reference_new_proxy): ref and + unref nodes, #okay61676 + + * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_sort): we listen + to the property; no need to clear the other columns. Also, we go + to 'unsorted' if the model supports it. + 2001-10-05 Sven Neumann * demos/testpixbuf-save.c diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 604368417d..88082d59f9 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,15 @@ +Fri Oct 5 20:50:00 2001 Jonathan Blandford + + * gtk/gtktreestore.c (gtk_tree_store_iter_has_child): improve + warning. + + * gtk/gtktreemodel.c (gtk_tree_row_reference_new_proxy): ref and + unref nodes, #okay61676 + + * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_sort): we listen + to the property; no need to clear the other columns. Also, we go + to 'unsorted' if the model supports it. + 2001-10-05 Sven Neumann * demos/testpixbuf-save.c diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 604368417d..88082d59f9 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,15 @@ +Fri Oct 5 20:50:00 2001 Jonathan Blandford + + * gtk/gtktreestore.c (gtk_tree_store_iter_has_child): improve + warning. + + * gtk/gtktreemodel.c (gtk_tree_row_reference_new_proxy): ref and + unref nodes, #okay61676 + + * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_sort): we listen + to the property; no need to clear the other columns. Also, we go + to 'unsorted' if the model supports it. + 2001-10-05 Sven Neumann * demos/testpixbuf-save.c diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 604368417d..88082d59f9 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,15 @@ +Fri Oct 5 20:50:00 2001 Jonathan Blandford + + * gtk/gtktreestore.c (gtk_tree_store_iter_has_child): improve + warning. + + * gtk/gtktreemodel.c (gtk_tree_row_reference_new_proxy): ref and + unref nodes, #okay61676 + + * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_sort): we listen + to the property; no need to clear the other columns. Also, we go + to 'unsorted' if the model supports it. + 2001-10-05 Sven Neumann * demos/testpixbuf-save.c diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 604368417d..88082d59f9 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,15 @@ +Fri Oct 5 20:50:00 2001 Jonathan Blandford + + * gtk/gtktreestore.c (gtk_tree_store_iter_has_child): improve + warning. + + * gtk/gtktreemodel.c (gtk_tree_row_reference_new_proxy): ref and + unref nodes, #okay61676 + + * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_sort): we listen + to the property; no need to clear the other columns. Also, we go + to 'unsorted' if the model supports it. + 2001-10-05 Sven Neumann * demos/testpixbuf-save.c diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 604368417d..88082d59f9 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,15 @@ +Fri Oct 5 20:50:00 2001 Jonathan Blandford + + * gtk/gtktreestore.c (gtk_tree_store_iter_has_child): improve + warning. + + * gtk/gtktreemodel.c (gtk_tree_row_reference_new_proxy): ref and + unref nodes, #okay61676 + + * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_sort): we listen + to the property; no need to clear the other columns. Also, we go + to 'unsorted' if the model supports it. + 2001-10-05 Sven Neumann * demos/testpixbuf-save.c diff --git a/gtk/gtktreemodel.c b/gtk/gtktreemodel.c index ecc23857f3..daba5bf7d0 100644 --- a/gtk/gtktreemodel.c +++ b/gtk/gtktreemodel.c @@ -1146,6 +1146,10 @@ gtk_tree_model_foreach (GtkTreeModel *model, * GtkTreeRowReference */ +static void gtk_tree_row_reference_unref_path (GtkTreePath *path, + GtkTreeModel *model, + gboolean free_last); + #define ROW_REF_DATA_STRING "gtk-tree-row-refs" struct _GtkTreeRowReference @@ -1256,10 +1260,6 @@ gtk_tree_row_ref_deleted_callback (GObject *object, * deletion with the old path of the just-deleted row. Which means * that the deleted path is the same now-defunct "coordinate system" * as the path saved in the reference, which is what we want to fix. - * - * Note that this is different from the situation in "inserted," so - * while you might think you can cut-and-paste between these - * functions, it's not going to work. ;-) */ tmp_list = refs->list; @@ -1276,6 +1276,7 @@ gtk_tree_row_ref_deleted_callback (GObject *object, } else if (gtk_tree_path_compare (path, reference->path) == 0) { + gtk_tree_row_reference_unref_path (reference->path, reference->model, FALSE); gtk_tree_path_free (reference->path); reference->path = NULL; } @@ -1353,6 +1354,42 @@ connect_ref_callbacks (GtkTreeModel *model) model); } + +/* We do this recursively so that we can unref children nodes before their parent */ +static void +gtk_tree_row_reference_unref_path_helper (GtkTreePath *path, + GtkTreeModel *model, + GtkTreeIter *parent_iter, + gint depth, + gboolean free_last) +{ + GtkTreeIter iter; + + if (free_last == FALSE && path->depth - 1 == depth) + return; + if (path->depth == depth) + return; + + gtk_tree_model_iter_nth_child (model, &iter, NULL, path->indices[depth]); + gtk_tree_row_reference_unref_path_helper (path, model, &iter, depth + 1, free_last); + gtk_tree_model_unref_node (model, &iter); +} + +static void +gtk_tree_row_reference_unref_path (GtkTreePath *path, + GtkTreeModel *model, + gboolean free_last) +{ + GtkTreeIter iter; + + if (free_last == FALSE && path->depth == 1) + return; + + gtk_tree_model_iter_nth_child (model, &iter, NULL, path->indices[0]); + gtk_tree_row_reference_unref_path_helper (path, model, &iter, 1, free_last); + gtk_tree_model_unref_node (model, &iter); +} + static void disconnect_ref_callbacks (GtkTreeModel *model) { @@ -1373,6 +1410,18 @@ disconnect_ref_callbacks (GtkTreeModel *model) NULL); } +/** + * gtk_tree_row_reference_new: + * @model: A #GtkTreeModel + * @path: A valid #GtkTreePath + * + * Creates a row reference based on @path. This reference will keep pointing to + * the node pointed to by @path, so long as it exists. It listens to all + * signals on model, and updates it's path appropriately. If @path isn't a + * valid path in @model, then %NULL is returned. + * + * Return value: A newly allocated #GtkTreeRowReference, or %NULL + **/ GtkTreeRowReference * gtk_tree_row_reference_new (GtkTreeModel *model, GtkTreePath *path) @@ -1390,11 +1439,31 @@ gtk_tree_row_reference_new_proxy (GObject *proxy, { GtkTreeRowReference *reference; RowRefList *refs; + GtkTreeIter parent_iter; + gint i; g_return_val_if_fail (G_IS_OBJECT (proxy), NULL); g_return_val_if_fail (GTK_IS_TREE_MODEL (model), NULL); g_return_val_if_fail (path != NULL, NULL); + g_return_val_if_fail (path->depth > 0, NULL); + + /* check that the path is valid */ + if (gtk_tree_model_get_iter (model, &parent_iter, path) == FALSE) + return NULL; + + /* Now we want to ref every node */ + gtk_tree_model_iter_nth_child (model, &parent_iter, NULL, path->indices[0]); + gtk_tree_model_ref_node (model, &parent_iter); + + for (i = 1; i < path->depth; i++) + { + GtkTreeIter iter; + gtk_tree_model_iter_nth_child (model, &iter, &parent_iter, path->indices[i]); + gtk_tree_model_ref_node (model, &iter); + parent_iter = iter; + } + /* Make ther row reference */ reference = g_new (GtkTreeRowReference, 1); g_object_ref (proxy); @@ -1499,7 +1568,10 @@ gtk_tree_row_reference_free (GtkTreeRowReference *reference) g_object_unref (reference->model); if (reference->path) - gtk_tree_path_free (reference->path); + { + gtk_tree_row_reference_unref_path (reference->path, reference->model, TRUE); + gtk_tree_path_free (reference->path); + } g_free (reference); } diff --git a/gtk/gtktreestore.c b/gtk/gtktreestore.c index 62f3a1cd88..632dbbb65e 100644 --- a/gtk/gtktreestore.c +++ b/gtk/gtktreestore.c @@ -632,7 +632,7 @@ gtk_tree_store_iter_has_child (GtkTreeModel *tree_model, GtkTreeIter *iter) { g_return_val_if_fail (GTK_IS_TREE_STORE (tree_model), FALSE); - g_return_val_if_fail (iter != NULL, FALSE); + g_return_val_if_fail (iter->stamp == GTK_TREE_STORE (tree_model)->stamp, FALSE); g_return_val_if_fail (iter->user_data != NULL, FALSE); return G_NODE (iter->user_data)->children != NULL; diff --git a/gtk/gtktreeviewcolumn.c b/gtk/gtktreeviewcolumn.c index 1ff3fad279..eb082d68fb 100644 --- a/gtk/gtktreeviewcolumn.c +++ b/gtk/gtktreeviewcolumn.c @@ -799,39 +799,42 @@ static void gtk_tree_view_column_sort (GtkTreeViewColumn *tree_column, gpointer data) { - GList *list; + gint sort_column_id; + GtkSortType order; + gboolean has_sort_column; + gboolean has_default_sort_func; g_return_if_fail (tree_column->tree_view != NULL); - if (tree_column->show_sort_indicator) + has_sort_column = + gtk_tree_sortable_get_sort_column_id (GTK_TREE_SORTABLE (GTK_TREE_VIEW (tree_column->tree_view)->priv->model), + &sort_column_id, + &order); + has_default_sort_func = + gtk_tree_sortable_has_default_sort_func (GTK_TREE_SORTABLE (GTK_TREE_VIEW (tree_column->tree_view)->priv->model)); + + if (has_sort_column && + sort_column_id == tree_column->sort_column_id) { - if (tree_column->sort_order == GTK_SORT_ASCENDING) - gtk_tree_view_column_set_sort_order (tree_column, GTK_SORT_DESCENDING); + if (order == GTK_SORT_ASCENDING) + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (GTK_TREE_VIEW (tree_column->tree_view)->priv->model), + tree_column->sort_column_id, + GTK_SORT_DESCENDING); + else if (order == GTK_SORT_DESCENDING && has_default_sort_func) + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (GTK_TREE_VIEW (tree_column->tree_view)->priv->model), + GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, + GTK_SORT_ASCENDING); else - gtk_tree_view_column_set_sort_order (tree_column, GTK_SORT_ASCENDING); + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (GTK_TREE_VIEW (tree_column->tree_view)->priv->model), + tree_column->sort_column_id, + GTK_SORT_ASCENDING); } else { - gtk_tree_view_column_set_sort_order (tree_column, GTK_SORT_ASCENDING); - gtk_tree_view_column_set_sort_indicator (tree_column, TRUE); - } - - list = (GTK_TREE_VIEW (tree_column->tree_view)->priv->columns); - g_assert (list); - while (list) - { - GtkTreeViewColumn *tmp_column; - - tmp_column = GTK_TREE_VIEW_COLUMN (list->data); - if (tmp_column->visible && tmp_column != tree_column) - gtk_tree_view_column_set_sort_indicator (tmp_column, FALSE); - - list = list->next; + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (GTK_TREE_VIEW (tree_column->tree_view)->priv->model), + tree_column->sort_column_id, + GTK_SORT_ASCENDING); } - - gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (GTK_TREE_VIEW (tree_column->tree_view)->priv->model), - tree_column->sort_column_id, - tree_column->sort_order); } @@ -1777,9 +1780,11 @@ gtk_tree_view_column_get_widget (GtkTreeViewColumn *tree_column) /** * gtk_tree_view_column_set_alignment: * @tree_column: A #GtkTreeViewColumn. - * @xalign: alignment (0.0 for left, 0.5 for center, 1.0 for right) + * @xalign: The alignment, which is between [0.0 and 1.0] inclusive. * * Sets the alignment of the title or custom widget inside the column header. + * The alignment determines its location inside the button -- 0.0 for left, 0.5 + * for center, 1.0 for right. **/ void gtk_tree_view_column_set_alignment (GtkTreeViewColumn *tree_column, -- 2.30.2